from django.shortcuts import render
from django.views import View
import logging
# Create your views here.
from apps.areas.models import Area
from django.http import JsonResponse
"""
# ---------- 查询省级区域信息 ----------
# SQL语句：查询`tb_areas`表中「父级ID为130000」的记录（通常对应“省级”数据，如河北省）
# select * from tb_areas where parent_id=130000;

# Django ORM方式：通过`filter`筛选`parent_id=130000`的`Area`模型对象
Area.objects.filter(parent_id=130000)

# 更精准的“单条查询 + 反向关联查询下级”演示（交互式命令行场景）：
# >>> province = Area.objects.get(id=130000)  # 获取ID为130000的省级对象（如“河北省”）
# >>> province.subs.all()  # 通过反向关联字段`subs`，查询该省下的所有“市级”区域


# ---------- 查询市级/区县区域信息 ----------
# SQL语句：查询`tb_areas`表中「父级ID为130600」的记录（通常对应“市级”数据，如保定市）
# select * from tb_areas where parent_id=130600;

# Django ORM方式：筛选`parent_id=130600`的`Area`模型对象（对应“市级”数据）
Area.objects.filter(parent_id=130600)

# 结合“省级→市级→区县”的关联查询演示（交互式命令行场景）：
# >>> province = Area.objects.get(id=130000)  # 先获取省级对象（如“河北省”）
# >>> citys = province.subs.all()  # 查询该省下的所有“市级”对象
# >>> city = Area.objects.get(id=130600)  # 再获取某市级对象（如“保定市”）
# >>> city.subs.all()  # 通过`subs`查询该市级下的所有“区县”对象
"""

"""
需求：获取省份信息

前端交互逻辑：
当页面加载时，会自动发送axios请求到后端，目的是获取省份数据（用于省市区选择组件初始化等场景）

后端处理逻辑说明：
- 请求特点：无需前端传递任何请求参数（如查询字符串、请求体数据等）
- 业务逻辑：从数据库中查询所有“省份级别”的区域信息（通常依赖区域模型的层级关联，如`parent_id`标识上级区域）
- 响应格式：以JSON格式返回省份数据

接口路由：配置为 `areas/`（前端请求的URL路径）

实现步骤拆解：
1. 查询省份信息：通过Django ORM操作区域模型（如`Area`模型），筛选出所有省份记录
2. 返回响应：将查询到的省份数据序列化后，以JSON响应返回给前端
"""
logger = logging.getLogger('django')
from django.core.cache import cache
from django.views import View
from django.http import JsonResponse
# 假设Area模型已导入
# from .models import Area

class AreaView(View):
    def get(self, request):
        """获取所有省份信息（逻辑正确）"""
        province_list = cache.get('province')
        try:
            if not province_list:
                # 调试：检查数据库连接和表结构
                try:
                    # 尝试多种查询方式
                    provinces = Area.objects.filter(parent=None)
                    if not provinces.exists():
                        # 如果没有parent=None的数据，尝试parent_id=0
                        provinces = Area.objects.filter(parent_id=0)
                    if not provinces.exists():
                        # 如果还是没有，获取所有顶级区域（没有父级的）
                        provinces = Area.objects.filter(parent_id__isnull=True)
                    
                    province_list = []
                    for province in provinces:
                        province_list.append({
                            'id': province.id,
                            'name': province.name
                        })
                    
                    # 如果仍然没有数据，记录警告
                    if not province_list:
                        logger.warning('No province data found in database')
                        return JsonResponse({'code': 400, 'errmsg': '数据库中没有省份数据'})
                    
                    # 注意：AreaView这里的cache.set是放在if块内的（正确）
                    cache.set('province', province_list, 24*3600)
                except Exception as db_error:
                    logger.error(f'Database query error: {db_error}')
                    # 尝试获取一些样本数据来调试
                    try:
                        sample_areas = Area.objects.all()[:5]
                        logger.info(f'Sample areas: {[(a.id, a.name, a.parent_id) for a in sample_areas]}')
                    except Exception as sample_error:
                        logger.error(f'Cannot get sample areas: {sample_error}')
                    raise db_error
        except Exception as e:
            logger.error(f'AreaView error: {e}')
            return JsonResponse({'code': 400, 'errmsg': f'省份数据错误: {str(e)}'})
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'province_list': province_list})  


class SubAreaView(View):
    def get(self, request, pk):
        """获取市或区信息（修复后）"""
        cache_key = 'sub_area_' + str(pk)
        sub_data = cache.get(cache_key)  # 先查缓存

        try:
            # 只有缓存未命中时，才查询数据库并处理
            if sub_data is None:
                # 查询父级区域，并判断是否存在
                parent_model = Area.objects.filter(id=pk).first()
                if not parent_model:  # 父级不存在时主动抛异常
                    raise ValueError(f"父级区域ID不存在: {pk}")
                
                # 获取子区域并序列化
                sub_model_list = parent_model.subs.all()
                sub_list = []
                for sub in sub_model_list:
                    sub_list.append({
                        'id': sub.id,
                        'name': sub.name
                    })
                
                # 组装sub_data（仅在缓存未命中时执行）
                sub_data = {
                    'id': parent_model.id,
                    'name': parent_model.name,
                    'subs': sub_list
                }
                
                # 仅缓存未命中时，才写入缓存（和AreaView保持一致逻辑）
                cache.set(cache_key, sub_data, 24 * 3600)
        
        except Exception as e:
            logger.error(e)
            return JsonResponse({'code': 400, 'errmsg': '城市或区数据错误'})

        # 返回响应（缓存命中时直接用缓存数据，未命中时用数据库数据）
        return JsonResponse({'code': 0, 'errmsg': 'OK', 'sub_data': sub_data})
#数据的增删改查
# -------- 增（新增地址） --------
# 1. 接收数据
# 2. 验证数据
# 3. 数据入库
# 4. 返回响应

# -------- 删（删除指定记录） --------
# 1. 查询到指定记录
# 2. 删除数据（物理删除 / 逻辑删除）
# 3. 返回响应

# -------- 改（修改个人邮箱等信息） --------
# 1. 查询指定的记录
# 2. 接收数据
# 3. 验证数据
# 4. 数据更新
# 5. 返回响应

# -------- 查（个人中心数据展示、省市区联动等查询） --------
# 1. 查询指定数据
# 2. 将对象数据转换为字典数据（序列化）
# 3. 返回响应
# 举例： 美多商城
# 注册用户 1个亿
# 日活用户 1%     1百万
# 下单比例 1%       1w  10000
#  新增地址的概率 1%   100    300次   2次

# 不经常发生变化的数据 我们最好缓存到redis（内容）中 减少数据库的查询

# 5分钟